Entity Framework Core(以下簡稱 EF Core)是由微軟推出在 .NET 平台的 ORM(Object Relational Mapping)框架,照字面翻成中文就是:物件關聯對應。
早期在 EF 還沒推出時,開發人員若要操作 DB,會透過 Sqldataadapter 等等的類別連結、CRUD 資料庫,並且將資料存在 DataSet、DataTable 等,這種方式稱作 ADO.NET。
後來微軟用 ADO.NET 做延伸,發展出 EF 這套 ORM 框架,讓開發人員可以更簡單的去操作 DB,不需要再撰寫太多的 ADO.NET Function 即可達到許多操作,且可以讓 Table 物件化,可以用強型別的方式進行開發,免除掉使用 DataSet、DataTable 是弱型別的缺點(有方法可以讓 DS、DT 欄位是強型別,不過相對就複雜些)。
而這次開發會使用 Code First 的方式,也就是說全程使用 C# 的 Code 來異動 DB、Table。
ASP.NET Core 專案預設是沒有 EF Core 的,必須透過 Nuget 來安裝,而這次會使用 .NET CLI 命令列來操作 EF Core,以下列出安裝 EF Core 的語法:
你可以透過 PowerShell 或是 cmd 將目錄切換到專案的目錄下(.csproj 專案檔的目錄),並輸入以下指令:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.Relational
dotnet add package Microsoft.EntityFrameworkCore.Design
這裡的 dotnet
開頭代表正在使用 .NET CLI 來安裝套件。
而使用 .NET CLI 操作 EF Core 則需要安裝 dotnet-ef
這一個工具,輸入 dotnet tool install --global dotnet-ef
來安裝,這裡的 --global 代表全域,也就是使用全域設定安裝後,就會一直保留在電腦中,未來不需要每次開發新專案就再安裝一次。
依照 Day3 所設計的 Table,來建立 Model:
Events:
EventsCategory:
EventsInfo:
EventsImage:
EventsImageUseType:
EF Core 會自動辨識 Id 或是 ClassnameId 來作為 Primary Key,e.g. 在 Events 類別中,EventsId 或 Id 皆會被 EF 辨識為 PK。
若 A 表對 B 表關係為一對一,則兩邊的屬性皆必須有彼此的類別:e.g. Events 對 EventsInfo 為一對一,則 Events 內需要有 public EventsInfo EventsInfo {get; set;}
,反之 EventsInfo 亦同;
若 A 表對 B 表關係為一對多,則屬於一的表需要加入一個 ICollection 的屬性:e.g. Events 對 EventsImage 為一對多,則 Events 內需要有 public ICollection<EventsImage> EventsImage {get; set;}
,反之 EventsImage 則為 public EventsImage EventsImage {get; set;}
;
同理,多對多就是兩張表都放 ICollection。
首先在 Models 中建立 DbContext
,目的是為了讓 EF Core 透過這裡的 Code 去讀取設定檔以及建立 Table 的實體屬性,而今天僅會建立 Table 的實體屬性。
從 .NET Core 開始引入了 Dependency Injection(DI),這部分會在下一篇解釋,簡單說開發人員可以便於控制專案需要用到哪些服務、變更設定、或是更容易地去測試。
而為了讓專案透過 DbContext 去連接 SQL Server 以及設定連接字串,我們必須要到專案的 Startup.cs
進行設定,連接 DB 的服務被註冊起來。
在 ConfigureServices
Function 中加入以下 Code:
Configuration.GetConnectionString("DefaultConnection")
表示系統從 appsettings.json
這個設定檔尋找 DefaultConnection
這一個 key,並將 value 作為連接 DB 的 ConnectionString,所以我們要到 appsettings.json
去新增 key-value,如下:
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=EventsSystem;Trusted_Connection=True;MultipleActiveResultSets=True;MultipleActiveResultSets=true"
}
本次使用 Localdb 來做本次的資料庫 Server,版本為 SQL Server 2019,並已經事先建立好空白的 EventsSystem 資料庫。
使用 .NET CLI 來執行 Migration(移轉),可以解釋為讓 EF Core 將以上設定轉換到 SQL Server,並建立類似版控的記錄檔。
dotnet ef migrations add InitialCreate
InitialCreate
為自行輸入字串的部分,可以當作 git 的 commit message。
本次 Migration 的內容,且可以注意到檔名使用執行 Migration 的時間 + Message。
也因為資料庫
如果要退回上一次的 Migration,可以執行 dotnet ef migrations remove
。
當確認沒問題後,可以正式更新到 DB,執行 dotnet ef database update
。
然後就成功在 DB 新增了 Table,一切都很快速!
不過像 nvarchar 欄位長度卻都被設定為 MAX,這顯然不太好,下一篇會來指定欄位的長度。
如果你是第一次使用 Code First 的方式操作 DB 的話,可能會覺得有點憋扭,但相信我,Code First 確實會讓開發迅速許多!甚至還內建 DB 的類版控功能。
不過以往的 DB First 也好,Code First 也好,開發方法並沒有絕對,只要團隊溝通好,或是自己對哪個比較偏好,再去選擇哪種方式即可。
今天成功了建立 Model,並透過 EF Core 使用 Migration 到 DB 新增 Table,不過有美中不足的地方,就等明天來解決了!
接下來除了會提到自訂欄位屬性以外,也會先建立簡單的頁面並透過 EF Core 來對 DB 進行 CRUD。
那麼今天的文章就到這了,我們明天見!
安裝 Entity Framework Core
EF Core NuGet 套件
教學課程:在 ASP.NET MVC Web 應用程式中開始使用 EF Core
教學課程:第 5 部分,將移轉套用至 Contoso University 範例
[鐵人賽 Day24] ASP.NET Core 2 系列 - Entity Framework Core